console.log('定义函数、接口或者类的时候不提前指定具体的数据类型 ，当使用时再指定具体的数据类')

// 直接提前规定了数据类型
function add(x: string, y: string): string {
    return x + y
}

// 没有规定数据类型
function add1<T>(x: T, y: T): T[] {
    return [x, y]
}

// 调用时传入数据类型
add1<string>('jdk', 'l23')
console.log(add1<string>('jdk', 'l23'))

add1<number>(123, 456)
console.log(add1<number>(123, 456))






// 元组类型允许表示一个已知元素数量和类型的数组，各元素的类型不必相同
// 当返回值为元组
function yuanzu<T, K>(x: T, y: K): [T, K] {
    return [x, y]
}
yuanzu<string, number>('jdk', 123456)









interface Person<T, K> {
    name: T,
    age: K,
    sex: T
}
let name: Person<string, number> = {
    name: 'jack',
    age: 15,
    sex: '男'
}
console.log(name);

let name1: Person<boolean, number> = {
    name: false,
    age: 10,
    sex: true
}
console.log(name1);

console.log('泛型约束')
interface Length {
    length: number
}

function names<T extends Length>(x: T) {
    console.log(x.length);
}